package soccerBet.project.dao;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import soccerBet.project.objects.*;
import soccerBet.project.utils.*;

public class JogoDAO {

	private Jogo jogoObj;
	
	private Equipa equipaCasaObj;
	
	private Equipa equipaForaObj;
	
	private List<Jogo> jogoObjList;


	public void updateJogo(int idJogo, Date dataGame, String date) {

		Session session = HibernateUtil.getSessionFactory().openSession();
		
		session.beginTransaction();
		
		session.
		createQuery("update Jogo set data = ?, date = ? where idJogo = ? ").setTimestamp(0, dataGame).setString(1,date).setInteger(2,idJogo).executeUpdate();
		
		session.getTransaction().commit();
		
		
		session.close();
	}
	
	public void insertToDB(Jogo jogo) {
		// TODO Auto-generated method stub
		
		Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();

    	session.saveOrUpdate(jogo);

        //Commit the transaction
        session.getTransaction().commit();
        
    	
		session.close();
	}
	
	
	public void getJogo(Integer jogoId) {

		Session session = HibernateUtil.getSessionFactory().openSession();
		
		Jogo jogo = (Jogo)  session.
		createQuery("select j from Jogo as j where j.idJogo = ?").setInteger(0, jogoId).uniqueResult();
		
		
		session.close();
		
		this.setJogoObj(jogo);


	}
	


	public void getMostRecentGames() {

		Session session = HibernateUtil.getSessionFactory().openSession();
		List<Jogo> jogosList= new ArrayList<Jogo>();
		
		List<Jogo> jogoDate = (List<Jogo>)  session.
		createQuery("select j from Jogo as j where j.data != null and j.data > ? order by j.data asc group by j.data").setDate(0, new Date()).list();
		
		if(jogoDate!=null && jogoDate.size()>0 && jogoDate.get(0).getDate().equals(Utils.getData(new Date()))){
			jogosList = (List<Jogo>)  session.
			createQuery("select j from Jogo as j where (j.equipaByIdEquipaFora.favorita = 1 or j.equipaByIdEquipaCasa.favorita = 1)  and j.date = ? order by data asc").setString(0, jogoDate.get(0).getDate()).list();
		}
		
		
		session.close();
		
		this.setJogoObjList(jogosList);
	}
	
	public void getMostRecentGamesNotBet() {

		Session session = HibernateUtil.getSessionFactory().openSession();
		List<Jogo> jogosList= new ArrayList<Jogo>();
		
		List<Jogo> jogoDate = (List<Jogo>)  session.
		createQuery("select j from Jogo as j where j.data != null and j.data > ? order by j.data asc group by j.data").setDate(0, new Date()).list();
		
		if(jogoDate!=null && jogoDate.size()>0 && jogoDate.get(0).getDate().equals(Utils.getData(new Date()))){
			jogosList = (List<Jogo>)  session.
			createQuery("select j from Jogo as j where (j.equipaByIdEquipaFora.favorita != 1 and j.equipaByIdEquipaCasa.favorita != 1)  and j.date = ? order by data asc").setString(0, jogoDate.get(0).getDate()).list();
		}
		
		
		session.close();
		
		this.setJogoObjList(jogosList);
	}
	
	
	
	public void getJogoByDate(String data) {

		Session session = HibernateUtil.getSessionFactory().openSession();
		
		List<Jogo> jogosList = (List<Jogo>)  session.
		createQuery("select j from Jogo as j where j.date = ?").setString(0, data).list();
		
		
		session.close();
		
		this.setJogoObjList(jogosList);

	}
	
	public void getEquipas(Integer jogoId) {

		Session session = HibernateUtil.getSessionFactory().openSession();
		
		Equipa equipaCasa= (Equipa)  session.
		createQuery("select e from Jogo as j join j.equipaByIdEquipaCasa as e where j.idJogo = ?").setInteger(0, jogoId).uniqueResult();
		
		this.setEquipaCasaObj(equipaCasa);
		
		Equipa equipaFora= (Equipa)  session.
		createQuery("select e from Jogo as j join j.equipaByIdEquipaFora as e where j.idJogo = ?").setInteger(0, jogoId).uniqueResult();
		
		this.setEquipaForaObj(equipaFora);
		
		
		session.close();
		

	}
	
	public void getEquipaCasa(Integer jogoId) {

		Session session = HibernateUtil.getSessionFactory().openSession();
		
		Equipa equipaCasa= (Equipa)  session.
		createQuery("select e from Jogo as j join j.equipaByIdEquipaCasa as e where j.idJogo = ?").setInteger(0, jogoId).uniqueResult();
		
		this.setEquipaCasaObj(equipaCasa);
		
		
		session.close();
		

	}
	
	public void getEquipaFora(Integer jogoId) {

		Session session = HibernateUtil.getSessionFactory().openSession();
		
		Equipa equipaFora= (Equipa)  session.
		createQuery("select e from Jogo as j join j.equipaByIdEquipaFora as e where j.idJogo = ?").setInteger(0, jogoId).uniqueResult();
		
		this.setEquipaForaObj(equipaFora);
		
		
		session.close();
		

	}
	
	public void getJogosDisputados(Date getdataActualizacao, Date datenow, int idEpocaLiga) {
		// TODO Auto-generated method stub
		
		Session session = HibernateUtil.getSessionFactory().openSession();
		
		List<Jogo> jogosList = (List<Jogo>)  session.
		createQuery("select j from Jogo as j join j.jornada as jorn join " +
				" jorn.ronda as rond join rond.epocaLiga as el" +
				" where data between ? and ? and el.idEpocaLiga = ?").setDate(0,getdataActualizacao).setDate(1,datenow).setInteger(2, idEpocaLiga).list();
		
		
		session.close();
		
		this.setJogoObjList(jogosList);
	}

	public void getJogosBroken() {
		
		
		Session session = HibernateUtil.getSessionFactory().openSession();
		
		List<Jogo> jogosList = (List<Jogo>)  session.
		createQuery("select j from Jogo as j " +
				    " where j.data = null or HOUR(j.data) = '00'").list();
		
		
		session.close();
		
		this.setJogoObjList(jogosList);
		
	}
	
	public void getJogosWithoutResults() {
		
		Session session = HibernateUtil.getSessionFactory().openSession();
		
		List<Jogo> jogosList = (List<Jogo>)  session.
		createQuery("select j from Jogo as j left join j.estatisticases as e " +
				    " where (e is null and j.data < ?) or (e is null and j.data = null)").setDate(0,new Date((new Date().getTime() + (1000*60*60*24*7)))).list();
		
		
		session.close();
		
		this.setJogoObjList(jogosList);
		
	}
	
	


	public void setJogoObj(Jogo jogoObj) {
		this.jogoObj = jogoObj;
	}

	public Jogo getJogoObj() {
		return jogoObj;
	}

	public void setJogoObjList(List<Jogo> jogoObjList) {
		this.jogoObjList = jogoObjList;
	}

	public List<Jogo> getJogoObjList() {
		return jogoObjList;
	}

	public void setEquipaCasaObj(Equipa equipaCasaObj) {
		this.equipaCasaObj = equipaCasaObj;
	}

	public Equipa getEquipaCasaObj() {
		return equipaCasaObj;
	}

	public void setEquipaForaObj(Equipa equipaForaObj) {
		this.equipaForaObj = equipaForaObj;
	}

	public Equipa getEquipaForaObj() {
		return equipaForaObj;
	}

	













	


}